package br.com.hstar.client.quarto.listaprodutos;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.produto.grupo.GrupoUI;
import br.com.hstar.client.produto.produto.ProdutoUI;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class ListaProdutosPanel extends VerticalPanel {

	private DockPanel 		dockPanel;
	private HorizontalPanel hp;
	private VerticalPanel 	table;
	private HorizontalPanel buttonsPanel;
	
	//listBox de produtos
	private ListBox gruposListBox;
	private ListBox produtosListBox;
	private List 	produtosSelecionados;
	private List    produtosUIList;
	
	public ListaProdutosPanel() {
		produtosSelecionados    = new ArrayList();
		dockPanel 	= new DockPanel();
		hp 			= new HorizontalPanel();
		
		buttonsPanel = new HorizontalPanel();
		buttonsPanel.setStyleName( "Intpanel-South" );
		buttonsPanel.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_RIGHT );
		buttonsPanel.setHorizontalAlignment( HasAlignment.ALIGN_RIGHT );
		
		//título da tabela
		HTML html = new HTML( "Itens Consumidos" );
		html.setStyleName( "IntPanel-Title" );
		dockPanel.add( html, DockPanel.NORTH );
		
		dockPanel.add( buttonsPanel, DockPanel.SOUTH );
		dockPanel.setStyleName( "DockPanel" );
		
		//adds the center table where the elements go later.
		table = new VerticalPanel();
		table.setStyleName( "ContentTable" );
		dockPanel.add( table, DockPanel.CENTER );

		hp.add( dockPanel );
		
		add(hp);
		
		gruposListBox = addSimpleListBox("Grupo");
		gruposListBox.addItem("GRUPOS", "-1");
		gruposListBox.addChangeListener(new ChangeListener(){
			public void onChange(Widget arg0) {
				produtosListBox.clear();
				ServiceFactory.createProdutoService().listByGroup( 
						new Long(gruposListBox.getValue(gruposListBox.getSelectedIndex())), new ListAllProdutosAsyncCallback());
			}
		});
		produtosListBox = addListBox("Produtos");
		ServiceFactory.createGrupoService().listAll(new ListAllGruposAsyncCallback());
		
	}
	
	public String getValorConsumido() {
		float valor = 0.00f;
		for (int i = 0; i < produtosSelecionados.size(); i++) {
			valor = valor + ((ProdutoUI)produtosSelecionados.get(i)).getPrecoVenda().floatValue();
		}
		
		return valor+"";
	}
	
	// Private ----------------------------------------------------------------------------------
	
	public void addProduct(final ProdutoUI produto) {
		produtosSelecionados.add(produto);

		//adicoina o ítem visual
		//essa implementacao do Image contem o PordutoDO.
		final MyImage img = new MyImage( getImageUrl("img/remove.png") );
		img.setProduto(produto);
		
		final HorizontalPanel vp = new HorizontalPanel();
		vp.add(new HTML(produto.getNome()));
		vp.add(img);
		
		addWidget(vp);
		img.addClickListener(new ClickListener(){
			public void onClick(Widget arg0) {
				removeProduct(vp, produto);
			}
		});
		
	}
	public void removeProduct(Widget wid, ProdutoUI prod) {
		produtosSelecionados.remove(prod);
		table.remove(wid);
	}
	
	public ListBox addListBox(String title){
		HorizontalPanel p = new HorizontalPanel();
		Button b 		  = new Button("+");
		b.addClickListener(new MyClickListener());
		
		ListBox listBox = new ListBox();
		listBox.setMultipleSelect(false);		
		listBox.setTitle(title);
				
		p.add(listBox);
		p.add(b);
		
		addWidget(p);
		return listBox;
	}

	public ListBox addSimpleListBox(String title){
		HorizontalPanel p = new HorizontalPanel();

		ListBox listBox = new ListBox();
		listBox.setMultipleSelect(false);		
		listBox.setTitle(title);
				
		p.add(listBox);
		
		addWidget(p);
		return listBox;
	}
	
	//click do botao de "+" do listbox
	private class MyClickListener implements ClickListener {
		public void onClick(Widget listBox) {
			ProdutoUI pro = (ProdutoUI)(produtosUIList.get(produtosListBox.getSelectedIndex()));
			addProduct(pro);
		}
	}
	
	private void addWidget(Widget widget) {
		table.add(widget);
	}

	public Button addButton(String text) {
		Button but = new Button(text);
		buttonsPanel.add(but);
		return but;
	}
	
	public List getProdutosSelecionados() {
		return produtosSelecionados;
	}
	
	/**
	 * Este metodo recupera os produtos e lista-os.
	 * Será usado na atualizacao dos quartos, pois os
	 * produtos já devem vir carregados.
	 */
	public void setProdutosSelecionados(Set produtos) {
		List l = new ArrayList(produtos);
		for (int i = 0; i < l.size(); i++) {
			ProdutoUI p = (ProdutoUI)l.get(i);
			addProduct(p);
		}
	}
	
	// lista todos os produtos para colocar no listbox -----------------------------------------
	private class ListAllProdutosAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO ao listar produtosasdada");
		}

		public void onSuccess(Object result) {
			produtosUIList = (List) result;
			for (Iterator iter = produtosUIList.iterator(); iter.hasNext();) {
				ProdutoUI produtoUI = (ProdutoUI) iter.next();
				produtosListBox.addItem(produtoUI.getNome(), produtoUI.getId().toString());				
			}
		}
	}
		
	
//	 lista todos os grupos para colocar no listbox -----------------------------------------
	private class ListAllGruposAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO ao listar grupos");
		}

		public void onSuccess(Object result) {
			if(result != null){
				List grupos = (List) result;
				for (int i = 0; i < grupos.size(); i++) {
					GrupoUI grUI = (GrupoUI) grupos.get(i);
					gruposListBox.addItem(grUI.getNome(), grUI.getId().toString());				
				}
			}
		}
	}
	
	//-----------------------------------------------------
	public static String getImageUrl( String relImgUrl ) {
		return GWT.getModuleBaseURL() + relImgUrl;
	}
	
}
